package com.fjh.csdn_spider.utils.common_utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件操作类
 * 
 * @date 2021年7月16日
 * @author Antg
 */
public class FileUtil {
	/*---------------------------------->文件获取<----------------------------------*/
	/**
	 * 获取文件对象<br>
	 * 如果文件不存在则创建,并创建对应的目录文件 如果filepath为空,那么返回null
	 * 
	 * @param filePath
	 *            文件的路径
	 * @return 文件对象
	 * @date 2021年7月16日
	 * @author Antg
	 * @throws IOException
	 */
	public static File getFile(String filePath) throws IOException {
		if (filePath == null || filePath.trim().length() == 0) {
			return null;
		}
		File file = new File(filePath);
		String parent = file.getParent();
		// 首先判断该文件的父目录是否存在
		if (parent != null) {
			File parentFile = new File(parent);
			// 不存在就创建
			if (!parentFile.exists()) {
				parentFile.mkdirs();// 级联创建
			}
		}
		// 判断文件是否存在,不存在就创建
		if (!file.exists()) {
			file.createNewFile();
		}
		return file;
	}

	/*---------------------------------->文件写入<----------------------------------*/
	/**
	 * 将一个字符串写入到一个文件中
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @param charset
	 *            字符编码
	 * @param append
	 *            是否覆盖,false 覆盖, true 不覆盖
	 * @return 成功返回true,失败返回false
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static boolean addStringToFile(String data, File file,
			String charset, boolean append) throws IOException {
		String methodLocation = "FileUtil.addStringToFile-->";
		if (data == null) {
			System.out.println(methodLocation + "写入数据为空");
			return false;
		}
		if (charset == null || charset.trim().length() == 0) {
			System.out.println(methodLocation + "字符编码为空");
			return false;
		}
		FileOutputStream fos = new FileOutputStream(file, append);
		OutputStreamWriter osw = new OutputStreamWriter(fos, charset);
		osw.write(data);
		osw.flush();
		osw.close();
		return true;
	}

	/*---------------------------------->文件写入(覆盖式)<----------------------------------*/
	/**
	 * 将一个字符串写入到一个文件中去(覆盖原文件的内容)
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @param charset
	 *            字符编码
	 * @return 成功返回true,失败返回false
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static boolean addStringCoverToFile(String data, File file,
			String charset) throws IOException {
		return addStringToFile(data, file, charset, false);
	}

	/**
	 * 将一个字符串写入到一个文件中去(覆盖原文件的内容)
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @param charset
	 *            字符编码
	 * @return 成功返回true,失败返回false
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static boolean addStringCoverToFile(String data, String file,
			String charset) throws IOException {
		return addStringCoverToFile(data, new File(file), charset);
	}

	/**
	 * 将一个字符串写入到一个文件中去(覆盖原文件的内容) 默认字符编码utf-8
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @return 成功返回true,失败返回false
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static boolean addStringCoverToFile(String data, String file)
			throws IOException {
		return addStringCoverToFile(data, file, "utf-8");

	}

	/**
	 * 将一个字符串写入到一个文件中去(覆盖原文件的内容) 默认字符编码utf-8
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @return 成功返回true,失败返回false
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static boolean addStringCoverToFile(String data, File file)
			throws IOException {
		return addStringCoverToFile(data, file, "utf-8");

	}

	/*---------------------------------->文件写入(追加式)<----------------------------------*/
	/**
	 * 将一个字符串写入到一个文件中去(追加到原文件中)
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @param charset
	 *            字符编码
	 * @return 成功返回true,失败返回false
	 * @date 2021年7月16日
	 * @author Antg
	 * @throws IOException
	 */
	public static boolean addStringAppendToFile(String data, File file,
			String charset) throws IOException {
		return addStringToFile(data, file, charset, true);
	}

	/**
	 * 将一个字符串写入到一个文件中去(追加到原文件中)<br>
	 * 默认字符编码utf-8
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @return 成功返回true,失败返回false
	 * @date 2021年7月16日
	 * @author Antg
	 * @throws IOException
	 */
	public static boolean addStringAppendToFile(String data, File file)
			throws IOException {
		return addStringToFile(data, file, "utf-8", true);
	}

	/**
	 * 将一个字符串写入到一个文件中去(追加到原文件中)<br>
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @return 成功返回true,失败返回false
	 * @date 2021年7月16日
	 * @author Antg
	 * @throws IOException
	 */
	public static boolean addStringAppendToFile(String data, String file,
			String charset) throws IOException {
		return addStringToFile(data, new File(file), charset, true);
	}

	/**
	 * 将一个字符串写入到一个文件中去(追加到原文件中)<br>
	 * 默认字符编码utf-8
	 * 
	 * @param data
	 *            要写入的数据
	 * @param file
	 *            目标文件
	 * @return 成功返回true,失败返回false
	 * @date 2021年7月16日
	 * @author Antg
	 * @throws IOException
	 */
	public static boolean addStringAppendToFile(String data, String file)
			throws IOException {
		return addStringToFile(data, new File(file), "utf-8", true);
	}

	/*---------------------------------->文件读取<----------------------------------*/
	/**
	 * 按行读取文件并将文件存储到一个list中(可指定读取的行数)<br>
	 * 大于文件的总行数则返回全部文件内容
	 * 
	 * @param file
	 *            要读取的文件
	 * @param charset
	 *            读取的字符编码
	 * @param numLimit
	 *            是否限制行数 ,true限制,false不限制,全读,num无效,随意写一个就行
	 * @param num
	 *            要读取的行数
	 * @return 一个字符串集合
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static List<String> getListWithLine(File file, String charset,
			boolean numLimit, int num) throws IOException {
		List<String> list = new ArrayList<String>();
		FileInputStream fis = new FileInputStream(file);
		InputStreamReader isr = new InputStreamReader(fis, charset);
		BufferedReader br = new BufferedReader(isr);
		String buf = null;
		int counter = 0;
		if (numLimit) {
			if (num <= 0) {
				System.out.println("FileUtil.getListWithLine-->行数错误");
				return null;
			}
			while ((buf = br.readLine()) != null) {
				list.add(buf);
				counter++;
				if (counter < num) {
					continue;
				} else {
					break;
				}
			}
		} else {
			while ((buf = br.readLine()) != null) {
				list.add(buf);
				counter++;
			}
		}
		br.close();
		return list;
	}

	/**
	 * 按行读取文件并将文件存储到一个list中(可指定读取的行数)<br>
	 * 大于文件的总行数则返回全部文件内容
	 * 
	 * @param file
	 *            要读取的文件
	 * @param charset
	 *            读取的字符编码
	 * @param numLimit
	 *            是否限制行数 ,true限制,false不限制,全读,num无效,随意写一个就行
	 * @param num
	 *            要读取的行数
	 * @return 一个字符串集合
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static List<String> getListWithLine(String file, String charset,
			boolean numLimit, int num) throws IOException {
		return getListWithLine(new File(file), charset, numLimit, num);
	}

	/**
	 * 按行读取文件并将文件存储到一个list中(全部读取)
	 * 
	 * @param file
	 *            要读取的文件
	 * @param charset
	 *            读取的字符编码
	 * @return 一个字符串集合
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static List<String> getListWithLine(File file, String charset)
			throws IOException {
		return getListWithLine(file, charset, false, 0);
	}

	/**
	 * 按行读取文件并将文件存储到一个list中(全部读取)
	 * 
	 * @param file
	 *            要读取的文件
	 * @param charset
	 *            读取的字符编码
	 * @return 一个字符串集合
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static List<String> getListWithLine(String file, String charset)
			throws IOException {
		return getListWithLine(file, charset, false, 0);
	}

	/**
	 * 按行读取文件并将文件存储到一个list中(指定行数)<br>
	 * 大于文件的总行数则返回全部文件内容
	 * 
	 * @param file
	 *            要读取的文件
	 * @param charset
	 *            读取的字符编码
	 * @param num
	 *            要读取的行数
	 * @return 一个字符串集合
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static List<String> getListWithLine(File file, String charset,
			int num) throws IOException {
		return getListWithLine(file, charset, true, num);
	}

	/**
	 * 按行读取文件并将文件存储到一个list中(指定行数)<br>
	 * 大于文件的总行数则返回全部文件内容
	 * 
	 * @param file
	 *            要读取的文件
	 * @param charset
	 *            读取的字符编码
	 * @param num
	 *            要读取的行数
	 * @return 一个字符串集合
	 * @throws IOException
	 * @date 2021年7月16日
	 * @author Antg
	 */
	public static List<String> getListWithLine(String file, String charset,
			int num) throws IOException {
		return getListWithLine(file, charset, true, num);
	}
}
